package com.example.sxt_practise.IO;

import java.io.File;
import java.io.IOException;
import java.util.Objects;

/**
 * @author gaofeng
 * @date 2022年05月07日 23:37
 */
public class FileTest {
    public static void main(String[] args) {
        // 分隔符
        // 存在盘符:就是绝对路径,反之,就是相对路径
        String fileAbsolutePath = "D:/project/project_code/MyBatis_TEST/src/main/java/image" ;
        // 相对路径,相对于当前目录
        String filePath = "receive.jpeg" ;
        String path = "D:" + File.separatorChar + "project" + File.separatorChar + "project_code" + File.separatorChar
                     + "MyBatis_TEST" + File.separatorChar + "src" + File.separatorChar + "main" + File.separatorChar
                    + "java" + File.separatorChar + "image" + File.separatorChar + "流按功能分类.png";
        System.out.println(File.separatorChar);

        // 构造File对象
        File file = new File(filePath) ;
        System.out.println("文件名称:" + file.getName());
        // 返回的是文件的长度(字节数),文件夹是0
        System.out.println(file.length());
        // 返回相对或者绝对路径,根据创建文件时指定的路径
        System.out.println(file.getPath());

        File directory = new File(fileAbsolutePath) ;
        System.out.println("文件夹的长度 " + directory.length());

        System.out.println(file.getAbsolutePath());
        // 获取文件名前面分隔符之前的路径
        System.out.println(file.getParent());
        System.out.println(file.getParentFile());
        // 也可以构建一个不存在的file对象
        File file1 = new File("111receive.jpeg") ;
        System.out.println("文件存在:" + file1.exists());
        System.out.println("是否是文件" + file1.isFile()) ;
        System.out.println("是否是目录" + file1.isDirectory()) ;
        System.out.println(file1.length());

        file = new File("/image", "流按功能分类.png") ;

        file = new File(new File("/image"), "流按功能分类.png") ;

        File txtFile = new File("io.txt") ;
        try {
            // createNewFile() 不存在才创建
            // con，con3...是操作系统的设备名，不能正确创建
            boolean createFlag = txtFile.createNewFile();
            System.out.println(createFlag);
            // 删除已经存在的文件
            boolean deleteFlag = txtFile.delete();
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 创建目录
        // mkdir 上级目录必须存在，否则创建失败，
        // mkdirs 上级目录可以不存在，不存在一同创建
        File dir = new File("dir/test") ;
//        boolean mkdir = dir.mkdir();
        boolean mkdir = dir.mkdirs();
        System.out.println(mkdir);

        File dir2 = new File("D:\\project\\project_code\\MyBatis_TEST") ;
        // 列出下级名称
        String[] sonNames = dir2.list();
        for (String sonName : sonNames) {
            System.out.println(sonName);
        }
        // 列出下级file对象
        File[] sonFiles = dir2.listFiles();
        for (File sonFile : sonFiles) {
            System.out.println(sonFile);
        }
        // 列出所有盘符
        File[] sonRoots = dir2.listRoots();
        for (File sonRoot : sonRoots) {
            System.out.println(sonRoot);
        }

        // 打印子孙级目录和文件的名称
        printName(dir2, 0) ;

        File dir3 = new File("D:\\project\\project_code\\SXT-PRACTISE") ;
        System.out.println(countFileSize(dir3));
    }

    /**
     * 打印子孙级目录和文件的名称
     * @author gaofeng
     * @date  2022/5/8 10:42
     * @param file
     * @param deep
     * @return
     */
    private static void printName(File file, int deep) {
        for (int i = 0; i < deep; i++) {
            System.out.print("-");
        }
        System.out.println(file.getName());
        if (file == null || !file.exists()) {
            return;
        } else if (file.isDirectory()) {
            for (File listFile : Objects.requireNonNull(file.listFiles())) {
                printName(listFile, deep + 1);
            }
        }
    }

    /**
     * 统计大小
     * @author gaofeng
     * @date  2022/5/8 10:42
     * @param file
     * @return int
     */
    private static int countFileSize(File file) {
        int count = 0 ;
        if (file != null && file.exists()) {
            if (file.isFile()) {
                count += file.length() ;
            } else {
                for (File listFile : Objects.requireNonNull(file.listFiles())) {
                    count += countFileSize(listFile) ;
                }
            }
        }
        return count ;
    }
}
